import { useEffect } from 'react' import { Link } from 'react-router-dom' import { Field, Form, Formik, useFormikContext } from 'formik' import { trpc, inferQueryOutput } from '~/utils/trpc' import IVInputField from '~/components/IVInputField' import IVButton from '~/components/IVButton' import PageHeading from '~/components/PageHeading' import { notify } from '~/components/NotificationCenter' import { useHasPermission } from '~/components/DashboardContext' import IconChevronRight from '~/icons/compiled/ChevronRight' import { DialogStateReturn } from 'reakit' import IVDialog, { useDialogState } from '~/components/IVDialog' import EmptyState from '~/components/EmptyState' import { pluralizeWithCount } from '~/utils/text' import IVSpinner from '~/components/IVSpinner' import { useOrgParams } from '~/utils/organization' import IconClipboard from '~/icons/compiled/Clipboard' import useCopyToClipboard from '~/utils/useCopyToClipboard' import IVStatusPill from '~/components/IVStatusPill' export default function GroupsPage() { const { orgSlug } = useOrgParams() const canAddUsers = useHasPermission('WRITE_USERS') const groups = trpc.useQuery(['group.list']) const addGroupDialog = useDialogState() return (
{groups.data?.length ? ( ) : groups.isLoading ? ( ) : ( <>

Use Teams to restrict action access to a group of users.

)}
{canAddUsers && ( )}
) } function AddGroupDialog({ onSubmit, dialog, }: { onSubmit?: () => void dialog: DialogStateReturn }) { const addGroup = trpc.useMutation('group.add') const { isSuccess } = addGroup const { hide } = dialog useEffect(() => { if (isSuccess) { hide() notify.success('Team created') if (onSubmit) { onSubmit() } } }, [isSuccess, onSubmit, hide]) const isHidden = !dialog.visible && !dialog.animating const { reset: resetMutation } = addGroup useEffect(() => { if (isHidden) resetMutation() }, [isHidden, resetMutation]) return ( initialValues={{ name: '', }} onSubmit={async ({ name }) => { if (addGroup.isLoading) return addGroup.mutate({ data: { name, }, }) }} >
{addGroup.isError && (
Sorry, there was a problem creating the team.
)}
) } function ResetFormToken({ isResetReady }: { isResetReady: boolean }) { const { resetForm } = useFormikContext() useEffect(() => { if (isResetReady) resetForm() }, [resetForm, isResetReady]) return null } function GroupsList({ groups, }: { groups: inferQueryOutput<'group.list'> onChange?: () => void }) { return (
) } function GroupsListItem({ group, }: { group: inferQueryOutput<'group.list'>[0] }) { const { onCopyClick: copySlug } = useCopyToClipboard({ successMessage: 'Copied slug to clipboard', }) return (
  • {group.name}

    {group.scimGroupId && }
    {pluralizeWithCount(group._count.memberships, 'member')}
  • ) }